package com.atguigu.securitydemo1;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;

/**
 * @formatter:off
 * @author Jungle
 * SpringSecurity Web权限方案
 * 1.1 设置登录系统的账号、密码：三种方式
 *  方式一通过yaml文件配置
 *  方式二：继承WebSecurityConfigurerAdapter，重写configure方法   同时要注入 PasswordEncoder
 *  方式三：自定义编写实现类  （实际中主要使用，需要查询数据库）
 *      第一步创建配置类，设置使用哪个userDetailsService实现类
 *      第二步编写实现类，返回User对象，User对象有用户名密码和操作权限
 *  1.2 注解使用--简化开发
 *      1.2.1 @secured   判断是否具有角色，另外需要注意的是这里匹配的字符串需要添加前缀“ROLE_“
     *      1）启动类/配置类加注解 @EnableGlobalMethodSecurity(securedEnabled=true)
     *      2）方法上加注解  @Secured({"ROLE_normal","ROLE_admin"})
 *          3)UserDetailService(MyUserDetailService)设置用户角色 AuthorityUtils.commaSeparatedStringToAuthorityList("admins,ROLE_sale");
 *      1.2.2 @PreAuthorize 注解适合进入方法前的权限验证， @PreAuthorize可以将登录用户的roles/permissions参数传到方法中。
 *          1）@EnableGlobalMethodSecurity(prePostEnabled = true)  同时开启secured和prePostEnabled用 @EnableGlobalMethodSecurity(securedEnabled=true,prePostEnabled=true)
 *          2) 在controller上添加注解
 *      1.2.3 @PostAuthorize 方法执行之后验证
 *          1) @EnableGlobalMethodSecurity(prePostEnabled = true)
 *      1.2.4  @PostFilter 权限验证之后对数据进行过滤 留下用户名是admin1的数据
 *      1.2.5  @PreFilter 进入控制器之前对数据进行过滤  进入控制器之前对数据进行过滤
 *
 * @formatter:on
 */
@EnableGlobalMethodSecurity(securedEnabled=true,prePostEnabled=true)
@MapperScan("com.atguigu.securitydemo1.mapper")
@SpringBootApplication
public class SecurityDemo1Application {

    public static void main(String[] args) {
        SpringApplication.run(SecurityDemo1Application.class, args);
    }

}
